package com.cx.proxy.dhcp;

import com.cx.proxy.coust.ILog;
import com.cx.proxy.coust.IUser;
import com.cx.proxy.coust.IUserImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author zhangshuai
 * @version V1.0
 * @Project Java2_26
 * @Package com.cx.proxy.dhcp
 * @Description:
 * @Date 2025/5/28 11:00
 */
//cglib动态代理 基于子类的动态代理
public class CglibDhcpProxy implements MethodInterceptor {
    private Object target;

    public CglibDhcpProxy(Object target) {
        this.target = target;
    }

    //代理对象去调用真实对象的方法
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib动态代理开启");
        ILog.doLog();
        //调用目标对象的方法
        Object invokeSuper = methodProxy.invokeSuper(o, objects);
        System.out.println("cglib动态代理关闭");

        return invokeSuper;
    }
    //获取代理对象
    public Object getCglibProxy(){
        //创建增强器
        Enhancer enhancer = new Enhancer();
        //设置父类 目标对象 ，创建的代理对象就是目标对象的子类
        enhancer.setSuperclass(target.getClass());
        //设置回调函数   代理对象去调用真实对象的方法
        enhancer.setCallback(this);

        Object proxy = enhancer.create();
        return proxy;

    }

    public static void main(String[] args) {
        //获取真实对象
        IUser iUser = new IUserImpl();
        //获取代理代理    代理对象就是目标对象的子类
        IUser cglibProxy = (IUser) new CglibDhcpProxy(iUser).getCglibProxy();

        //代理对象去调用真实对象的方法
        cglibProxy.save();
        cglibProxy.update();
        cglibProxy.run();
    }


}